package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.manager.generico.ManagerPesquisarGenerico;
import br.com.foxinline.modelo.Endereco;
import br.com.foxinline.modelo.Imovel;
import br.com.foxinline.modelo.Iptu;
import br.com.foxinline.modelo.Parcela;
import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.servico.ImovelServico;
import br.com.foxinline.servico.IptuServico;
import br.com.foxinline.servico.ParcelaServico;
import br.com.foxinline.util.Caracter;
import java.util.*;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author elyjunior
 */
@ManagedBean
@ViewScoped
public class ManagerPesquisarIptu extends ManagerPesquisarGenerico<Imovel> {

    @EJB
    IptuServico iptuServico;
    @EJB
    private ParcelaServico parcelaServico;
    @EJB
    ImovelServico imovelServico;
    private List<Imovel> imoveis;
    private List<Iptu> iptus;
    private Iptu iptu;
    private Proprietario proprietario;
    private Proprietario contribuinte;
    private List<Proprietario> proprietarios;
    private Endereco endereco;
    private Imovel imovel;
    private int ano;
    private Boolean existePendencia;
    private String visaoInscricao = "";
    private String motivoBaixa;
    private Iptu iptuParam;
    private Parcela parcelaParam;
    private List<Imovel> imovelList;

    @Override
    public void init() {
        setServico(imovelServico);

        iptus = new ArrayList<Iptu>();
        proprietario = new Proprietario();
        proprietario.setTipoDocumento(TipoDocumento.CPF);
        iptu = new Iptu();
        endereco = new Endereco();
        imovel = new Imovel();
        Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(iptuServico.getDataAtual());
        ano = cal.get(Calendar.YEAR);

        proprietarios = new ArrayList<Proprietario>();
        imoveis = new ArrayList<Imovel>();
        contribuinte = new Proprietario();


    }

    public int anoIptu(Iptu iptuParam) {
        Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(iptuParam.getDataIptu());
        int x = cal.get(Calendar.YEAR);
        return x;
    }

    public void pesquisarIptu() {

        if (this.visaoInscricao != null && !this.visaoInscricao.isEmpty()) {
            String[] str = visaoInscricao.split("\\.");
            try {
                this.imovel.setInscricaoCadastralD(Integer.parseInt(str[0]) == 0 ? null : Integer.parseInt(str[0]));
            } catch (NumberFormatException e) {
                this.imovel.setInscricaoCadastralD(null);
            }
            try {
                this.imovel.setInscricaoCadastralS(Integer.parseInt(str[1]) == 0 ? null : Integer.parseInt(str[1]));
            } catch (NumberFormatException e) {
                this.imovel.setInscricaoCadastralS(null);
            }
            try {
                this.imovel.setInscricaoCadastralQuadra(Integer.parseInt(str[2]) == 0 ? null : Integer.parseInt(str[2]));
            } catch (NumberFormatException e) {
                this.imovel.setInscricaoCadastralQuadra(null);
            }
            try {
                this.imovel.setInscricaoCadastralLote(Integer.parseInt(str[3]) == 0 ? null : Integer.parseInt(str[3]));
            } catch (NumberFormatException e) {
                this.imovel.setInscricaoCadastralLote(null);
            }
            try {
                this.imovel.setInscricaoCadastralUnid(Integer.parseInt(str[4]) == 0 ? null : Integer.parseInt(str[4]));
            } catch (NumberFormatException e) {
                this.imovel.setInscricaoCadastralUnid(null);
            }
        }

        this.proprietario.setCpf(Caracter.removecaracter(this.proprietario.getCpf()));
        this.proprietario.setCnpj(Caracter.removecaracter(this.proprietario.getCnpj()));
        this.endereco.setCep(Caracter.removecaracter(this.endereco.getCep()));

        this.imovel.setEnderecoImovel(this.endereco);
        this.proprietarios.add(this.proprietario);
        this.imovel.setProprietarios(this.proprietarios);

        this.entidadePesquisar = this.imovel;

        getSearchResults().setFirst(0);
        onLoadModel();
//        imovelList = imovelServico.findImovel(entidadePesquisar);

    }

    @Override
    public void onLoadModel() {
        setDataModel(new LazyDataModel<Imovel>() {
            private static final long serialVersionUID = -4947818379131191002L;

            @Override
            public List<Imovel> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
                if (first != 0) {
//                    first = first + pageSize;
                    getSearchResults().setFirst(first);
                }

                List<Imovel> results = imovelServico.findValidImovel(entidadePesquisar, first, pageSize);

                if (results != null && results.isEmpty()) {
                    this.setRowCount(0);
                } else {

                    int value = imovelServico.quantidadeRegistros().intValue();

                    if (value < 5) {
                        this.setRowCount(value);
                    } else if (value % 5 == 0) {
//                        if (value - 5 != 0) {
//                            this.setRowCount(value);
//                        } else {
                        this.setRowCount(value);
//                        }
                    } else {
                        if (value >= pageSize) {
//                            this.setRowCount(value - pageSize - 1);
                            this.setRowCount(value);
                        } else {
                            this.setRowCount(pageSize);
                        }
                    }
                }


                return results;
            }

            @Override
            public void setRowIndex(int rowIndex) {
                if (rowIndex == -1 || getPageSize() == 0) {
                    super.setRowIndex(-1);
                } else {
                    super.setRowIndex(rowIndex % getPageSize());
                }
            }
        });
    }

//    public List<Iptu> imovelIptus(Imovel imovelParam) {
//        return iptuServico.imovelIptu(imovelParam);
//    }
    public Proprietario contribuinte(Imovel paramImovel) {
        Proprietario p = new Proprietario();
        List<Iptu> ips = iptus(paramImovel);
        if (ips != null) {
            for (Iptu ip : ips) {
                p = ip.getProprietario();
            }
        }
        return p;
    }

    public String existeParcelaPendencia(Iptu iptuParam) {
        String result;
        List<Parcela> parcelas = iptuServico.parcelas(iptuParam);
        if (parcelas != null && !parcelas.isEmpty()) {
            if (parcelas.get(0).getPago()) {
                result = "Iptu Regular";
            } else {
                if (parcelas.size() == 4 && parcelas.get(1).getPago() && parcelas.get(2).getPago() && parcelas.get(3).getPago()) {
                    result = "Iptu Regular";
                } else {
                    if (parcelas.size() == 3 && parcelas.get(1).getPago() && parcelas.get(2).getPago()) {
                        result = "Iptu Regular";
                    } else {
                        result = "Iptu Irregular";
                    }
                }
            }
        } else {
            result = "Iptu Irregular";
        }
        return result;
    }

    public List<Parcela> parcelas(Iptu iptu) {
        List<Parcela> parcelas = iptuServico.parcelas(iptu);

        if (parcelas != null && !parcelas.isEmpty()) {
            for (Parcela parcela : parcelas) {
                if (parcela.getIndice() == 0 && parcela.getPago() != null && parcela.getPago()) {
                    parcelas = new ArrayList<Parcela>();
                    parcelas.add(parcela);
                }
            }
        }

        return parcelas;
    }

    @Override
    public void limpar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void remover() {
    }

    public List<SelectItem> tipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo.getTipo(), tipo.getNome()));
        }
        return items;
    }

    public List<Iptu> iptus(Imovel imovel) {
        if (imovel != null && imovel.getId() != null) {
            return iptuServico.findIptuByImovelId(imovel.getId());
        }
        return new ArrayList<Iptu>();
    }

    public List<Iptu> getIptus() {
        return iptus;
    }

    public void setIptus(List<Iptu> iptus) {
        this.iptus = iptus;
    }

    public Iptu getIptu() {
        return iptu;
    }

    public void setIptu(Iptu iptu) {
        this.iptu = iptu;
    }

    public Proprietario getProprietario() {
        return proprietario;
    }

    public void setProprietario(Proprietario proprietario) {
        this.proprietario = proprietario;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public int getAno() {
        return ano;
    }

    public void setAno(int ano) {
        this.ano = ano;
    }

    public Boolean getExistePendencia() {
        return existePendencia;
    }

    public void setExistePendencia(Boolean existePendencia) {
        this.existePendencia = existePendencia;
    }

    public List<Imovel> getImoveis() {
        return imoveis;
    }

    public void setImoveis(List<Imovel> imoveis) {
        this.imoveis = imoveis;
    }

    public Proprietario getContribuinte() {
        return contribuinte;
    }

    public void setContribuinte(Proprietario contribuinte) {
        this.contribuinte = contribuinte;
    }

    public void geraBoleto(Iptu i, Parcela p) throws Exception {

        i = iptuServico.find(i.getId());
        p = parcelaServico.find(p.getId());

        iptuServico.gerarGuia(null, i, p);
    }

    public void baixaManualIPTU() {

        parcelaParam = parcelaServico.find(parcelaParam.getId());

        parcelaParam.setMotivoBaixaManual(motivoBaixa);
        parcelaParam.setBaixaManual(true);
        parcelaParam.setDataBaixaManual(iptuServico.getDataAtual());

        parcelaServico.update(parcelaParam);

        iptuParam = iptuServico.find(iptuParam.getId());

        if (parcelaParam.getIndice() == 0) {
            iptuParam.setBaixaManual(true);
            iptuParam.setDataBaixaManual(iptuServico.getDataAtual());
        } else {
            List<Parcela> parcelas = iptuParam.getParcelas();
            boolean completa = true;
            for (Parcela parcela : parcelas) {
                if (parcela.getIndice() != 0 && !parcela.equals(parcelaParam) && (!parcela.getBaixaManual() || !parcela.getPago())) {
                    completa = false;
                }
            }
            if (completa) {
                iptuParam.setBaixaManual(true);
                iptuParam.setDataBaixaManual(iptuServico.getDataAtual());
            }
        }

        iptuServico.update(iptuParam);
    }

    public void setDadosBaixa() {
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();

        iptuParam = iptuServico.find(Long.parseLong(params.get("iptuParam")));
        parcelaParam = parcelaServico.find(Long.parseLong(params.get("parcelaParam")));
    }

    public boolean possivelBaixa(Iptu i, Parcela p) {

        if ((p.getBaixaManual() != null && p.getBaixaManual()) || (p.getPago() != null && p.getPago())) {
            return false;
        } else {
            List<Parcela> parcelas = i.getParcelas();
            for (Parcela parcela : parcelas) {
                if ((p.getBaixaManual() != null && parcela.getBaixaManual() && (p.getIndice() == 0 || parcela.getIndice() == 0))
                        || (p.getPago() != null && parcela.getPago() && (p.getIndice() == 0 || parcela.getIndice() == 0))) {
                    return false;
                }
            }
        }
        return true;

    }

    public List<Imovel> imoveis() {
        imovelList = (List<Imovel>) imovelServico.findAll();
        for (Imovel i : imovelList) {
            if (!iptuServico.imovelValido(i)) {
                imovelList.remove(i);
            }
        }
        return imovelList;
    }

    public void limparTextAreaBaixaManual() {
        this.motivoBaixa = null;
    }

    public String getVisaoInscricao() {
        return visaoInscricao;
    }

    public void setVisaoInscricao(String visaoInscricao) {
        this.visaoInscricao = visaoInscricao;
    }

    public String getMotivoBaixa() {
        return motivoBaixa;
    }

    public void setMotivoBaixa(String motivoBaixa) {
        this.motivoBaixa = motivoBaixa;
    }

    public List<Imovel> getImovelList() {
        return imovelList;
    }

    public void setImovelList(List<Imovel> imovelList) {
        this.imovelList = imovelList;
    }
}
